RubyKaigi 2022 Day 1 Ruby meets WebAssembly
モチベーション
Rubyは書きやすい
Rubyの難しさ
実行にはRubyインタープリターのインストールが必要
Rubyをインストールせずに使いたい場合、大変
インストールバトル
ビルド、インストールが難しい
Ruby + WASM
WASMはゲームチェンジャー
ポータブル
言語非依存
Sandbox
ブラウザでRubyを実行できる
インストールも不要
WASMはx86やarmのレイヤー
デモ
hello world
vim
code:html
script ruby-head-wasm-wasi
script type=text/ruby
require "js"
document.write "hello"
ruby run -e httpd
HTML/JS/DOMのAPIをrubyで触れる
ブラウザ上でirbが動く
ブラウザ上のirbでgemが使える
ブラウザ上のsandbox内にgemがインストールされる
Term.echoでirbのアウトプットとしてHTMLを書ける
WASI
標準化されたシステムコールの仕様
WASMはファイルシステムなし、ネットワークなし、時計もなし
WASMにないものはJSにやらせている
WASMはブラウザに限らないものになっている
サーバーレスシステム
プラグインシステム
WASI
標準化されたシステムコールインターフェース
WASI対応プラットフォーム
Node.js
Fastly
Cloudflare
VSCode Extension
WASI対応言語
C/C++
Rust
Swift
Ruby
WASI + VFS
.rbファイルを配置する必要がある
.rbをwasmに埋め込む
wasi-VFS
read-only in-memory FS
デモ
Fastly
require "compute_runtime"
前半まとめ
Ruby 3.2でWASMとWASIのサポートが入る
How to port CRuby to WASM and WASI
CRubyのムズいところ
Exceptions
setjmp/longjmp
Fiber
context-switch
CRubyはGCのためにメモリ状態を見ている
WASMはスタックマシン
Unwind / Rewind
コールスタックの状態をまるごと保存・復元
Locals
メモリ状態をシリアライズしてスキャン
FAQ
スレッド関連APIはなし
バイナリサイズは圧縮しても2MB弱、標準ライブラリ含めると圧縮しても5MB
パフォーマンスはCRubyの半分、mrubyと同じくらい